package main

import (
	"context"
	"fmt"
	"log"
	"net"
	"os"
	"os/signal"
	"syscall"
	"time"

	_ "gitee.com/go-kade/go12/vblog/apps"
	"gitee.com/go-kade/go12/vblog/ioc"
	"gitee.com/go-kade/go12/vblog/protocol"
	"google.golang.org/grpc"
)

// func (s Student) String() string {
// 	return fmt.Sprintf("%s %d %d", s.Name, s.Age, s.Gender)
// }
/*


	// beego.Run("127.0.0.1:8999")
	// web.Run("0.0.0.0:8999")
	// aa, _ := net.ResolveTCPAddr("tcp", "0.0.0.0:8787")
	// bb, _ := net.ListenTCP("tcp", aa)
	// con, _ := bb.Accept()
	// cc := make([]byte, 1024)
	// con.Read(cc)
	// db := conf.C().MySQL.GetConn()
	// db.Find()
	// db.Find()

	// type User struct {
	// 	gorm.Model           // 添加默认的模型字段（ID、CreatedAt、UpdatedAt、DeletedAt）
	// 	Username   string    `json:"username"`
	// 	Password   string    `json:"password"`
	// 	Role       user.Role `json:"role"`
	// 	Id         int64     `json:"id" gorm:"primaryKey`
	// 	lock       sync.Mutex
	// 	conn       *gorm.DB
	// }
	// db, _ := gorm.Open(mysql.Open("root:cys000522@tcp(34.28.164.10:3306)/go12?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
	// err := db.AutoMigrate(&User{})
	// if err != nil {
	// 	log.Fatal("Failed to migrate User table")
	// }
	// fmt.Println("khnuig------------------")
*/
func main() {
	//1. 加载配置
	if err := ioc.Controller().Init(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// 初始化Api Handler
	if err := ioc.ApiHandler().Init(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	//2. 初始化控制
	// 2.1 user controlLer7
	// UserServiceImpl := impl.NewUserServiceImpl()
	// 2.2 token controller
	// TokenServiceImpl := impl1.NewTokenServiceImpl(UserServiceImpl)
	// 2.3 token api handler
	//httpHandler := api.NewTokenApiHeadler(TokenServiceImpl)
	// httpHandler := api.NewTokenApiHeadler(ioc.Controller().Get(token.AppName).(token.Service))

	// 3. 启动http协议服务器，注册 handler路由
	// r := gin.Default()
	// // httpHandler.Registry(r.Group("/api"))
	// ioc.ApiHandler().RouteRegistry(r.Group("/api"))

	// //启动路由服务器
	// r.Run(":9999")
	httpserver := protocol.NewHttpServer()
	go func() {
		if err := httpserver.Run(); err != nil {
			fmt.Println(err)
			os.Exit(1)
		}
	}()

	// 启动一个跑Grpc Server的Goroutine
	grpcServer := grpc.NewServer()
	// 把controller内 所有实现了grpc服务的模块注册给grpc server
	ioc.Controller().GrpcSerivceRegistry(grpcServer)

	go func() {
		fmt.Println("gprc 服务访问地址: 127.0.0.1:1234")
		lis, err := net.Listen("tcp", ":1234")
		if err != nil {
			log.Fatal(err)
		}
		err = grpcServer.Serve(lis)
		if err != nil {
			fmt.Printf("start grpc server error, %s", err)
		}
	}()
	
	//处理信号量
	ch := make(chan os.Signal, 1)
	signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP, syscall.SIGQUIT)
	// 等待信号的到来
	sn := <-ch
	fmt.Println(sn)

	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()
	httpserver.Close(ctx)

	//
	fmt.Println("清理工作")
}
